Helpful Information
 
 
Category: Software Design
"forum-messages" sorting

it may sound a little stupid or easy to be achieved, but it's a major problem to me (maybe i'm stupid).
suppose i want to make a forum. like forums in the world anyone can post new topics, and everybody can reply to them. the replies must be sorted in a tree-like structure visually. for example www.phorum.org (http://www.phorum.org) has such a structre. everything i could achieve is - i set 3 variables to each message which characterize it - id, thread and parent. id is standart unique id (as you make it in mysql), thread value tells me that certain message belongs to certian message (to sertain main topic, "conversation") - for example i post new topic which takes in mysql id = 1. so every reply to that messgae has a thread = 1.
with parent i can see which is the "parent", the "father" of a certain message - for example : i have e topic with id - 1. i have a reply to this topic with id 2, AND thread = 1, AND parent = 1. but i have a third reply with id=3 to message with id=2, so it will has thread 1 - because it belongs to the thread of message with id=1, but will have parent=2, because is a reply to message with id=2.
so my question is - how can i sort all the messages in tree-like structure (see the phorum.org link above)?
i found a function which sortes 2 dimensional arrays by 1 dimension. it works fine with simple integers :


// recursive function for merging two arrays
function array_merge_clobber($a1, $a2) {
if ( !is_array($a1) || !is_array($a2) ) {
return false;
}
$newarray = $a1;
while ( list($key, $val) = each($a2) ) {
if ( is_array($val) && is_array($newarray[$key]) ) {
$newarray[$key] = array_merge_clobber($newarray[$key], $val);
}
else {
$newarray[$key] = $val;
}
}
return $newarray;
}

it works fine when i use only these tree variables - id, thread and parent. but when adding and message specific variables like title, author, and message_body the arrya becomes 4 or 5 or more dimensional and bugs appear.
also the existing php function array_merge_recursive can help a little here, but with some pretty tricky loops and after all again bugs appear and the final result is not what i look for.
ahy help would be HIGHLY appreciated.
also, because i think i can't explain the problem very good ... some questions about the problem is also appreciated - maybe they will help me ... who knows :)
10x in advance

Perhaps I don't understand what you are asking, but what I do in this case is to have an array ($aPosts) of records, each record corresponding to a message. Each record is itself an array:
[id, thread, parent, sibling, title, author, ...]
Next, I have an array ($aIndex) which indexes into $aPosts. Thus, $aIndex starts out as [0, 1, 2, ...numberOfPosts-1]. This way, there is no worry about recursive merges, etc.

Sorting is also straightforward because I never touch $aPosts, only $aIndex. In particular, even multisorts are easy, because I first sort $aIndex on the least important index, then the next most important one, up to the most important.

Csaba










privacy (GDPR)